home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / CheeseToast 1.0.1 / Source / GamePrefs.c < prev    next >
Text File  |  1994-02-07  |  5KB  |  233 lines

  1. /************************************************************************************
  2.  * GamePrefs.c
  3.  *
  4.  * CheeseToast by Jim Bumgardner
  5.  *
  6.  ************************************************************************************/
  7.  
  8. #include "CToast.h"
  9.  
  10. // Data Structure that holds preferred keyboard mapping, sound level
  11. // and player name
  12. //
  13. PrefsData        gPrefs = 
  14.     {6,0x02,0x31, 0,        // fire
  15.      6,0x80,0x37, 0,        // thrust
  16.      15,0x08,0x7B, 0,        // left
  17.      15,0x10,0x7C, 0,        // right
  18.      15,0x40,0x3A, 0,        // shield
  19. //    Sound Level
  20.      0,
  21.      "\pWinner",
  22.      ""};
  23.  
  24. void LoadPreferences(void)
  25. {
  26.     Handle    h;
  27.     long    size;
  28.     h = GetResource(PrefsResType,128);
  29.     if (h) {
  30.         size = GetHandleSize(h);
  31.         BlockMove(*h, &gPrefs, size);
  32.         ReleaseResource(h);
  33.     }
  34. }
  35.  
  36. void SavePreferences(void)
  37. {
  38.     Handle    h;
  39.     while ((h = GetResource(PrefsResType, 128)) != NULL) {
  40.         RmveResource(h);
  41.         DisposHandle(h);
  42.     }
  43.     h = NewHandle(sizeof(PrefsData));
  44.     BlockMove(&gPrefs, *h, sizeof(PrefsData));
  45.     AddResource(h,PrefsResType,128,"\pPreferences");
  46.     WriteResource(h);
  47.     ReleaseResource(h);
  48. }
  49.  
  50. // Dialog for Remapping Keys
  51.  
  52. #define KeysDLOG    129
  53. #define FireItem    2
  54. #define ThrustItem    3
  55. #define ShieldItem    4
  56. #define LeftItem    5
  57. #define RightItem    6
  58.  
  59. short    gLastKeyCode,gLastAsciiCode;
  60.  
  61. void FeedbackKey(DialogPtr dp, short itemNbr, short keyCode, short asciiCode)
  62. {
  63.     short        t;
  64.     Handle        h;
  65.     Rect        r;
  66.     StringPtr    p, asciiStr=(StringPtr) "  ";
  67.  
  68.     p = NULL;
  69.     GetDItem(dp, itemNbr, &t,&h,&r);
  70.  
  71.     // Convert Non-Printable Keys to Words
  72.     switch (keyCode) {
  73.     case 0x24:    p = "\pReturn";        break;
  74.     case 0x31:    p = "\pSpace";        break;
  75.     case 0x33:    p = "\pDelete";        break;
  76.     case 0x35:    p = "\pEsc";        break;
  77.     case 0x37:    p = "\pCmd";        break;
  78.     case 0x38:    p = "\pShift";        break;
  79.     case 0x3D:
  80.     case 0x3A:    p = "\pOption";        break;
  81.     case 0x3E:
  82.     case 0x3B:    p = "\pControl";    break;
  83.     case 0x47:    p = "\pClear";        break;
  84.     case 0x4C:    p = "\pEnter";        break;
  85.     case 0x7B:    p = "\pLeft";        break;
  86.     case 0x7C:    p = "\pRight";        break;
  87.     case 0x7E:    p = "\pUp";            break;
  88.     case 0x7D:    p = "\pDown";        break;
  89.     default:    p = asciiStr;
  90.                 asciiStr[0] = 1;
  91.                 asciiStr[1] = asciiCode;
  92.                 break;
  93.     
  94.     }
  95.     SetIText(h, p);
  96.     SelIText(dp, itemNbr, 0,32767);
  97. }
  98.  
  99. void RegisterKey(short itemNbr, short keyCode, short asciiCode)
  100. {
  101.     switch (itemNbr) {
  102.     case FireItem:    
  103.         gPrefs.fireKeyByte = keyCode >> 3;
  104.         gPrefs.fireKeyBit = (1 << (keyCode & 7));
  105.         gPrefs.fireKeyCode = keyCode;
  106.         gPrefs.fireKeyAscii = asciiCode;
  107.         break;
  108.     case ThrustItem:
  109.         gPrefs.thrustKeyByte = keyCode >> 3;
  110.         gPrefs.thrustKeyBit = (1 << (keyCode & 7));
  111.         gPrefs.thrustKeyCode = keyCode;
  112.         gPrefs.thrustKeyAscii = asciiCode;
  113.         break;
  114.     case LeftItem:
  115.         gPrefs.leftKeyByte = keyCode >> 3;
  116.         gPrefs.leftKeyBit = (1 << (keyCode & 7));
  117.         gPrefs.leftKeyCode = keyCode;
  118.         gPrefs.leftKeyAscii = asciiCode;
  119.         break;
  120.     case RightItem:
  121.         gPrefs.rightKeyByte = keyCode >> 3;
  122.         gPrefs.rightKeyBit = (1 << (keyCode & 7));
  123.         gPrefs.rightKeyCode = keyCode;
  124.         gPrefs.rightKeyAscii = asciiCode;
  125.         break;
  126.     case ShieldItem:
  127.         gPrefs.shieldKeyByte = keyCode >> 3;
  128.         gPrefs.shieldKeyBit = (1 << (keyCode & 7));
  129.         gPrefs.shieldKeyCode = keyCode;
  130.         gPrefs.shieldKeyAscii = asciiCode;
  131.         break;
  132.     }
  133. }
  134.  
  135. pascal    Boolean    RemapDialogHook(WindowPtr dp,EventRecord *ep,int *ip)
  136. {
  137.     short    stroke;
  138.     short    editField;
  139.  
  140.     switch(ep->what) {
  141.         case keyDown:
  142.             if ((ep->message & charCodeMask) != '\t') {
  143.                 // record actual keystroke
  144.                 gLastKeyCode = (ep->message & keyCodeMask) >> 8;
  145.                 gLastAsciiCode = (ep->message & charCodeMask);
  146.                 editField = ((DialogPeek) dp)->editField+1;
  147.                 RegisterKey(editField, gLastKeyCode, gLastAsciiCode);
  148.                 FeedbackKey(dp, editField, gLastKeyCode, gLastAsciiCode);
  149.                 return TRUE;
  150.             }
  151.             return FALSE;
  152.         case updateEvt:
  153.             break;
  154.         case nullEvent:
  155.             // On idle, check for the following keys
  156.             stroke = 0;
  157.             if (ep->modifiers & cmdKey) {
  158.                 stroke = 0x37;
  159.             }
  160.             else if (ep->modifiers & shiftKey) {
  161.                 stroke = 0x38;
  162.             }
  163.             else if (ep->modifiers & optionKey) {
  164.                 stroke = 0x3A;
  165.             }
  166.             else if (ep->modifiers & controlKey) {
  167.                 stroke = 0x3B;
  168.             }
  169.             if (stroke) {
  170.                 editField = ((DialogPeek) dp)->editField+1;
  171.                 gLastKeyCode = stroke;    // !! Record It
  172.                 RegisterKey(editField, gLastKeyCode, 0);
  173.                 FeedbackKey(dp, editField, gLastKeyCode, 0);
  174.             }
  175.             break;
  176.         default:
  177.             break;
  178.     }
  179.     return FALSE;
  180. }
  181.  
  182. void RemapKeys(void)
  183. {
  184.     GrafPtr        savePort;
  185.     DialogPtr    dp;
  186.     short        itemHit,t;
  187.     Handle        h;
  188.     Rect        r;
  189.     Str63        theText;
  190.  
  191.     GetPort(&savePort);
  192.     if ((dp = GetNewDialog(KeysDLOG,NULL,(WindowPtr) -1)) == NULL)
  193.         return;
  194.  
  195.  
  196.     ShowWindow(dp);
  197.     SetPort(dp);
  198.  
  199.     ShowCursor();
  200.  
  201.     FeedbackKey(dp, FireItem, gPrefs.fireKeyCode, gPrefs.fireKeyAscii);
  202.     FeedbackKey(dp, ThrustItem, gPrefs.thrustKeyCode, gPrefs.thrustKeyAscii);
  203.     FeedbackKey(dp, LeftItem, gPrefs.leftKeyCode, gPrefs.leftKeyAscii);
  204.     FeedbackKey(dp, RightItem, gPrefs.rightKeyCode, gPrefs.rightKeyAscii);
  205.     FeedbackKey(dp, ShieldItem, gPrefs.shieldKeyCode, gPrefs.shieldKeyAscii);
  206.  
  207.     SelIText(dp, FireItem, 0,32767);
  208.  
  209.     do {
  210.         ModalDialog((ProcPtr) RemapDialogHook, &itemHit);
  211.         switch (itemHit) {
  212.         case FireItem:
  213.         case ThrustItem:
  214.         case ShieldItem:
  215.         case LeftItem:
  216.         case RightItem:
  217.             SelIText(dp, itemHit, 0, 32767);
  218.             break;
  219.         default:
  220.             break;
  221.         }
  222.     } while (itemHit != OK);
  223.  
  224.     HideCursor();
  225.  
  226.     DisposDialog(dp);
  227.  
  228.     SetPort(savePort);
  229.  
  230.     SavePreferences();
  231. }
  232.  
  233.